package com.lac.component.string;

import java.util.Arrays;

/**
 * @author xiaokuixiao
 * date2025/7/16 14:54
 */
public class Str {
    public static void main(String[] args) {
        // 只要创建就不可改变 如果被修改 则创建新的对象
        // 性能差 因为不可变都需要重新创建对象所以性能差
        // 多线程下安全 因为不可变创建新的对象所以线程安全
        String s = "123";
        String s1 = "123";
        System.out.println(s == s1);
        System.out.println(s.equals(s1));
        // 可变对象 可以直接修改对象，但是不会重建对象
        // 线程安全的 方法是同步的适用于多线程
        // 性能不如stringuild er 因为每次都要同步所以效率低一点  所有的方法都是synchronized修饰的所以安全
        StringBuffer stringBuffer = new StringBuffer("123");
        System.out.println(stringBuffer);
        stringBuffer.append("QWE");
        stringBuffer.reverse();
        System.out.println(stringBuffer);
        // 不是线程安全的. 适用于单线程
        // 线程不安全的，性能好，效率高
        // 但是多线程下不安全，因为没有同步锁，所以效率快，但是不安全
        StringBuilder stringBuilder = new StringBuilder("123");

        System.out.println(stringBuilder);
        stringBuilder.append("QWE");
        System.out.println(stringBuilder);
        int[] arr = {25,13,335,6,23};

        System.out.println(Arrays.toString(bubbleSort(arr)));


        int key = 5;

        System.out.println(commonBinarySearch(arr,key));
    }

    private static int[] bubbleSort(int[] nums) {

        int len = nums.length;

        if (len == 0 || len== 1){

            return nums;

        }

        for (int i = 0; i < len - 1; i++) {

            for (int j = 0; j < len - 1 - i; j++) {

                if (nums[j + 1] < nums[j]) {

                    int tmp = nums[j + 1];
                    nums[j + 1] = nums[j];
                    nums[j] = tmp;

                }

            }

        }

        return nums;

    }

    public static int commonBinarySearch(int[] arr, int key) {
        int low = 0;
        int high = arr.length - 1;

        if (key < arr[low] || key > arr[high] || low > high) {
            return -1;
        }

        while (low <= high) {
            int middle = (low + high) / 2;

            if (arr[middle] > key) {
                high = middle - 1;
            } else if (arr[middle] < key) {
                low = middle + 1;
            } else {
                return middle;
            }
        }

        return -1;
    }


}
